#ifndef RandomNumberGenerator_header_file
#define RandomNumberGenerator_header_file

#include <random>

// 提供随机数生成器，单实例。因为单实例实际的对象只有一个，所以没必要对获得的实例进行delete操作
// 使用方法：
// auto randomNumberGenerator = RandomNumberGenerator::getRandomNumberGenerator();
// std::cout << randomNumberGenerator->getRandomNumber(-10.0, 10.0) << std::endl;
class RandomNumberGenerator {

public:

    static RandomNumberGenerator* getRandomNumberGenerator() {
        if (nullptr != objectRandomNumberGenerator) {
            return objectRandomNumberGenerator;
        }
        objectRandomNumberGenerator = new RandomNumberGenerator();
        return objectRandomNumberGenerator;
    }

    double getRandomNumber(double minValue, double maxValue) {
        using namespace std;
        uniform_real_distribution<double> formateRandomNumberRange(minValue, maxValue);
        return formateRandomNumberRange(*randomEngine);
    }

protected:

    // 构造函数，因为单实例模式不需要在使用的时候手动进行new操作，所以构造函数声明为protected
    // 构造函数进行了随机数播种，用于保证重复运行程序每次的随机数都是不一样的
    RandomNumberGenerator() {
        using namespace std;
        random_device randomSeed;
        randomEngine = new default_random_engine();
        randomEngine->seed(randomSeed());
    }

private:

    // 用来保存唯一的随机数生成器对象的变量
    static RandomNumberGenerator* objectRandomNumberGenerator;

    // 生成实例时才初始化的随机数引擎
    std::default_random_engine* randomEngine = nullptr;

};

// 一开始没有实例的时候需要指定为nullptr，因为单实例获取实例方法需要严格判断当前是否存在非空的对象指针
RandomNumberGenerator* RandomNumberGenerator::objectRandomNumberGenerator = nullptr;

#endif
